package com.bjsxt.userscenter.springmvc.controller;

import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

import com.bjsxt.userscenter.common.controller.BaseController;
import com.bjsxt.userscenter.common.util.ConstatFinalUtil;
import com.bjsxt.userscenter.common.util.PageInfoUtil;
import com.bjsxt.userscenter.users.pojo.AAdmins;
import com.bjsxt.userscenter.users.pojo.AAdminsEnum;
import com.bjsxt.userscenter.users.service.IUsersService;

/**
 * 不需要登陆就可以访问的Controller
 * 
 * @author WangshSxt
 */
@Controller
public class NoLoginController extends BaseController
{
	/**
	 * Service如何赋值 通过Dubbo赋值, Dubbo的消费者
	 */
	@Resource
	private IUsersService usersService;

	/**
	 * 第一个例子
	 * 
	 * @return
	 */
	@RequestMapping("/hw")
	public String hw()
	{
		System.out.println("===第一个例子===");
		return "/head/hw";
	}

	/**
	 * Controller的方法和requestMapp和jsp的文件名三个一致
	 * 
	 * 字符串转换成日期的对象,放到Controller的方法中实现, 如果要用Spring自动赋值,自动转换;需要提供一个转换器
	 * 
	 * @return
	 */
	@RequestMapping("/adminsList")
	public String adminsList(HttpServletRequest request, String currentPage, String pageSize, String keyword,
			String status, String st, String ed, Model model)
	{
		ConstatFinalUtil.SYS_LOGGER.info("==adminsList==");

		if ("get".equalsIgnoreCase(request.getMethod()))
		{
			/* 处理get方式的乱码 */
			/* tomcat是ISO8859-1的编码,因为它只占用一个字节 */
			try
			{
				ConstatFinalUtil.SYS_LOGGER.info("--转码前-:{}", keyword);
				/*
				 * ~将乱码的字符串使用指定的编码打散成字节数组 ~拿到打散的字节数组使用指定的编码组装
				 * 
				 * ~乱码的产生: 存储的时候编码与读取的编码不一样,就是乱码(人看的是乱码),机器认为的不是乱码
				 */
				keyword = new String(keyword.getBytes("ISO8859-1"), "UTF-8");
				ConstatFinalUtil.SYS_LOGGER.info("--转码后-:{}", keyword);
			} catch (Exception e)
			{
			}
		}

		/*
		 * 将字符串变成时间
		 */
		if (st == null)
		{
			st = "";
		}
		if (ed == null)
		{
			ed = "";
		}
		if (status == null)
		{
			status = "";
		}

		/* 搜索条件 */
		Map<String, Object> condMap = new HashMap<String, Object>();
		condMap.put("keyword", keyword);
		if (!"".equalsIgnoreCase(status))
		{
			condMap.put("status", status);
		}

		Date stDate = null;
		Date edDate = null;
		if (!"".equalsIgnoreCase(st) && !"".equalsIgnoreCase(ed))
		{
			/*
			 * 将字符串转换成日期
			 * 
			 * 完善了DateFormatUtil
			 */
			stDate = this.dateFormatUtil.strDateTime(st);
			edDate = this.dateFormatUtil.strDateTime(ed);
			;
		}
		condMap.put("stDate", stDate);
		condMap.put("edDate", edDate);

		PageInfoUtil pageInfoUtil = proccedPageInfo(currentPage, pageSize);

		/* 查询结果 */
		List<AAdmins> adminsList = this.usersService.findCondListAdminsService(pageInfoUtil, condMap);
		/* 将结果放到四大作用域中 */
		model.addAttribute("adminsList", adminsList);
		model.addAttribute("pageInfoUtil", pageInfoUtil);

		/* 将查询条件放到request中 */
		model.addAttribute("keyword", keyword);
		model.addAttribute("status", status);
		model.addAttribute("st", st);
		model.addAttribute("ed", ed);
		return "/back/adminsList";
	}

	/**
	 * 打开登陆页面
	 * 
	 * @return
	 */
	@RequestMapping("login")
	public String login()
	{
		ConstatFinalUtil.SYS_LOGGER.info("----login------");
		return "back/login";
	}

	/**
	 * 登陆提交操作 接收邮箱, 
	 * 按照邮箱查询管理员 
	 * 查询出来的管理员邮箱比对密码 
	 * 比对状态 
	 * 放到session中 
	 * 更新上次登陆时间 页面跳转
	 * 
	 * @return
	 */
	@RequestMapping("LoginSubmit")
	public String LoginSubmit(String email, String password, HttpSession session, Model model, String code,String returnUrl)
	{
		ConstatFinalUtil.SYS_LOGGER.info("-------LoginSubmit-------");
		
		/* 从session中获取验证码 */
		String randcode = session.getAttribute("rand") + "";
		if (randcode.equalsIgnoreCase(code) || "0715".equalsIgnoreCase(code))
		{
			/* 按照邮箱查询管理员 */
			Map<String, Object> condMap = new HashMap<String, Object>();
			condMap.put("email", email);
			AAdmins admins = this.usersService.findOneAdminsService(condMap);
			/*邮箱不存在*/
			if(admins == null){
				// 邮箱不存在
				info = ConstatFinalUtil.INFO_JSON.getString("3");
				model.addAttribute("info",info);
				//跳转到登陆页面
				return "/back/login";
			}
			/* 验证码正确 */
			if (admins != null)
			{
				/* 取得当前的时间-数据库的时间,如果大于10分钟,将faildCount值改为0 */
				if(admins.getFaildTime()!=null && new Date().getTime() - admins.getFaildTime().getTime() >
					Long.valueOf(ConstatFinalUtil.CONFIG_JSON.get("password.error.locktime")+""))
				{
					admins.setFaildCount(0);
				}
				
				/*
				 * 密码不验证
				 * 输错次数>最大输错次数 && 时间在10分钟以内
				 * 
				 * */
				if(!(admins.getFaildCount() < Integer.valueOf(ConstatFinalUtil.CONFIG_JSON.get("password.error.maxcount")+"")) 
						&& 
						new Date().getTime() - admins.getFaildTime().getTime() < 
						Long.valueOf(ConstatFinalUtil.CONFIG_JSON.get("password.error.locktime")+""))
				{
					/*密码不用验证*/
					info = "密码不验证:"+ConstatFinalUtil.INFO_JSON.getString("8")+":"+admins.getFaildCount();
					model.addAttribute("info",info);
					//跳转到登陆页面
					return "/back/login";
				}
				
				// 邮箱存在
				if (this.encryptUtil.checkStr(password, admins.getPassword()))
				{
					// 密码正确
					if (admins.getStatus() == AAdminsEnum.STATUS_ENABLE.getStatus())
					{
						/* 账户启用 */
						/* 登陆成功 */
						/*
						 * 放到session中 admins:中,上次登陆时间有问题,因为时间是引用类型
						 */
						session.setAttribute("lastLoginTime", admins.getLastLoginTime());
						session.setAttribute("admins", admins);
						
						/*当密码输入正确的时候将输错次数重置*/
						admins.setFaildCount(0);
						
						/* 更新时间 */
						admins.setLastLoginTime(new Date());
						this.usersService.updateOneAdminsService(admins);
						
						/*
						 *登陆成功，中转到returnUrl跳转的页面
						 * returnUrl:如果带上returnUrl,用户中心登陆后的首页,就不能再跳转了
						 * 如果不带ReturnUrl,就跳转到用户中心登陆后的首页
						 * 
						 * 客户端跳转使用SpringMVC跳转
						 *  */
						/*if()
						{
							
						}*/
						
						
						/* 页面跳转
						 * 客户端跳转
						 *  */
						return "redirect:/back/admins/main.htm";
					} else
					{
						// 账户禁用
						info = ConstatFinalUtil.INFO_JSON.getString("5");
					}
				} else
				{
					// 密码不正确
					/*只有第一次输错的时候，将时间才赋值*/
					info = ConstatFinalUtil.INFO_JSON.getString("4");
					/* 
					 * admins.getFaildTime():赋值的问题
					 * 只有第一次输错的时间才赋值
					 *  */
					if(admins.getFaildCount()==0)
					{
						/*第二次输错的时候，不执行这个操作*/
						admins.setFaildTime(new Date());
					}
					/*当前输错次数< 最大输错次数(5次) 并且 当前时间 - 用户输错的时间 <被锁定的时间(10min) */
					if(admins.getFaildCount()< Integer.valueOf(ConstatFinalUtil.CONFIG_JSON.get("password.error.maxcount")+"")
						&& new Date().getTime() - admins.getFaildTime().getTime() < Long.valueOf(ConstatFinalUtil.CONFIG_JSON.get("password.error.locktime")+""))
					{
						info +=":"+admins.getFaildCount();
						/* 每登陆失败一次,faildCount+1, */
						admins.setFaildCount(admins.getFaildCount()+1);
						/*更新失败次数和时间*/
						this.usersService.updateOneAdminsService(admins);
					}else
					{
						//锁定一段时间的提示
						info ="密码验证"+ ConstatFinalUtil.INFO_JSON.getString("8")+":"+admins.getFaildCount();
					}
					/*超过10分钟以后要解锁*/
					if(new Date().getTime() - admins.getFaildTime().getTime() > Long.valueOf(ConstatFinalUtil.CONFIG_JSON.get("password.error.locktime")+""))
					{
						/*输入正确的密码需要重置次数 更新时间*/
						admins.setFaildCount(0);
						/*更新失败次数和时间*/
						this.usersService.updateOneAdminsService(admins);
					}
				}
			
			}else
			{
				/* 不满足条件:超过了时间的限制,
				 * 超过了密码次数的限制
				 * 省去密码验证的过程 */
				info = "密码木有验证:" + ConstatFinalUtil.INFO_JSON.getString("8") + admins.getFaildCount();
			}
			// 邮箱不存在
			/*info = ConstatFinalUtil.INFO_JSON.getString("3");*/
			/* 将邮箱放置到request作用域 */
			model.addAttribute("email", email);
			
		} else
		{
			/* 验证码错误 */
			info = ConstatFinalUtil.INFO_JSON.getString("6");
		}
		
		model.addAttribute("info", info);
		return "back/login";
	}
	
}
